複数の CloudWatch Alarm に対して一括でタグを付与する方法
アノテーション 顧客推進チーム(構築担当)のいたくらです。
複数の CloudWatch Alarm に対して一括でタグを付与したくなったことありませんか?私はあります。
ということで、シェルスクリプトを作成したので共有します。
2024/04/09 追記
2024/04/05 より、Amazon CloudWatch が AWS CloudFormation によるアラームのタグ付けをサポートするようになりました!
・公式情報:Amazon CloudWatch now supports tagging alarms with AWS CloudFormation
・関連 Issue:https://github.com/aws-cloudformation/cloudformation-coverage-roadmap/issues/64
背景
検証で CloudFormation テンプレートを使用して CloudWatch Alarm をまとめて作成したんですが、タグを付与するのを忘れていました。
CloudFormation テンプレートを修正して、変更セットを作って更新すればいいか~と思い、いざ CloudFormation のユーザガイドを確認すると、Type: "AWS::CloudWatch::Alarm" にタグのパラメータがありませんでした。
参考:AWS::CloudWatch::Alarm - AWS CloudFormation
ええ…マネコンで付与しないといけないの…?と思い調べていくと、Amazon CloudWatch リソースにタグを付ける - Amazon CloudWatch にたどり着きました。
なるほど、tag-resource AWS CLI コマンドと TagResource API しか提供されていませんでした。
ということで、今回は tag-resource AWS CLI コマンドを使用したシェルスクリプトを作成しました。
結論
こちらがアカウント上にあるアラームすべてに対して、一括でタグを付与するシェルスクリプトです。
#!/bin/bash #CloudWatch アラームの名前と ARN を取得する alarm_info=$(aws cloudwatch describe-alarms --query 'MetricAlarms[*].[AlarmName,AlarmArn]' --output text) #取得した情報を行ごとにループ処理する while read -r alarm_name alarm_arn; do echo "Adding tag to alarm: $alarm_name" #タグをアラームに付与する aws cloudwatch tag-resource \ --resource-arn "$alarm_arn" \ --tags Key=Name,Value="$alarm_name" done <<< "$alarm_info"
<説明>
Name タグの値としてアラーム名を設定したいので、まずアラーム名と tag-resource の引数に必要な ARN を取得しています。
取得した情報を基にタグをアラームに付与しています。
今回は Name = アラーム名 というタグを付与する場合ですが、少し変更すれば Env = prod / stg といったタグもまとめて付与できます。
<実行結果例>
$ sh add_tag.sh Adding tag to alarm: xxxxxx-CPUUtilization-80-percent-over Adding tag to alarm: xxxxxx-CPUUtilization-90-percent-over Adding tag to alarm: xxxxxx-DiskUsage-80-percent-over Adding tag to alarm: xxxxxx-DiskUsage-90-percent-over Adding tag to alarm: xxxxxx-MemoryUsed-80-percent-over Adding tag to alarm: xxxxxx-MemoryUsed-90-percent-over Adding tag to alarm: xxxxxx-CPUUtilization-80-percent-over Adding tag to alarm: xxxxxx-CPUUtilization-90-percent-over Adding tag to alarm: xxxxxx-DiskUsage-80-percent-over Adding tag to alarm: xxxxxx-DiskUsage-90-percent-over Adding tag to alarm: xxxxxx-MemoryUsed-80-percent-over Adding tag to alarm: xxxxxx-MemoryUsed-90-percent-over
応用
ある文字列(例: CPU)を含むアラームに対してのみ、タグを付与するシェルスクリプトです。
#!/bin/bash #CloudWatch アラームの名前と ARN を取得する alarm_info=$(aws cloudwatch describe-alarms --query 'MetricAlarms[*].[AlarmName,AlarmArn]' --output text) #取得した情報を行ごとにループ処理する while read -r alarm_name alarm_arn; do # アラーム名に "CPU" が含まれる場合にのみ処理を行う if echo "$alarm_name" | grep -q "CPU"; then echo "Adding tag to alarm: $alarm_name" #タグをアラームに付与する aws cloudwatch tag-resource \ --resource-arn "$alarm_arn" \ --tags Key=Name,Value="$alarm_name" fi done <<< "$alarm_info"
<実行結果例>
$ sh add_tag_2.sh Adding tag to alarm: xxxxxx-CPUUtilization-80-percent-over Adding tag to alarm: xxxxxx-CPUUtilization-90-percent-over Adding tag to alarm: xxxxxx-CPUUtilization-80-percent-over Adding tag to alarm: xxxxxx-CPUUtilization-90-percent-over
番外編
アカウント上にあるアラームに付与されているタグを一括で削除するシェルスクリプトです。
#!/bin/bash #CloudWatch アラームの ARN を取得する alarm_arns=$(aws cloudwatch describe-alarms --query 'MetricAlarms[*].[AlarmName,AlarmArn]' --output text) #取得した ARN を行ごとにループ処理する while read -r alarm_name alarm_arn; do echo "Removing Name tag from alarm: $alarm_arn" #タグをアラームから削除する aws cloudwatch untag-resource \ --resource-arn "$alarm_arn" \ --tag-keys Name done <<< "$alarm_arns"
<実行結果例>
$ sh delete_tag.sh Removing Name tag from alarm: arn:aws:cloudwatch:ap-northeast-1:111111111111:alarm:xxxxxx-CPUUtilization-80-percent-over Removing Name tag from alarm: arn:aws:cloudwatch:ap-northeast-1:111111111111:alarm:xxxxxx-CPUUtilization-90-percent-over Removing Name tag from alarm: arn:aws:cloudwatch:ap-northeast-1:111111111111:alarm:xxxxxx-DiskUsage-80-percent-over Removing Name tag from alarm: arn:aws:cloudwatch:ap-northeast-1:111111111111:alarm:xxxxxx-DiskUsage-90-percent-over Removing Name tag from alarm: arn:aws:cloudwatch:ap-northeast-1:111111111111:alarm:xxxxxx-MemoryUsed-80-percent-over Removing Name tag from alarm: arn:aws:cloudwatch:ap-northeast-1:111111111111:alarm:xxxxxx-MemoryUsed-90-percent-over Removing Name tag from alarm: arn:aws:cloudwatch:ap-northeast-1:111111111111:alarm:xxxxxx-CPUUtilization-80-percent-over Removing Name tag from alarm: arn:aws:cloudwatch:ap-northeast-1:111111111111:alarm:xxxxxx-CPUUtilization-90-percent-over Removing Name tag from alarm: arn:aws:cloudwatch:ap-northeast-1:111111111111:alarm:xxxxxx-DiskUsage-80-percent-over Removing Name tag from alarm: arn:aws:cloudwatch:ap-northeast-1:111111111111:alarm:xxxxxx-DiskUsage-90-percent-over Removing Name tag from alarm: arn:aws:cloudwatch:ap-northeast-1:111111111111:alarm:xxxxxx-MemoryUsed-80-percent-over Removing Name tag from alarm: arn:aws:cloudwatch:ap-northeast-1:111111111111:alarm:xxxxxx-MemoryUsed-90-percent-over
あとがき
CloudFormation テンプレートでタグを付与できない場合もあるんだなと勉強になりました。
この記事がどなたかのお役に立てれば幸いです。
アノテーション株式会社について
アノテーション株式会社はクラスメソッドグループのオペレーション専門特化企業です。
サポート・運用・開発保守・情シス・バックオフィスの専門チームが、最新 IT テクノロジー、高い技術力、蓄積されたノウハウをフル活用し、お客様の課題解決を行っています。
当社は様々な職種でメンバーを募集しています。
「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、アノテーション株式会社 採用サイトをぜひご覧ください。